﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using log4net;
using ServicioRFIDMovil.Entidad;
using ServicioRFIDMovil.DataAccess;
using ServicioRFIDMovil.Herramientas;
using System.Data;

namespace ServicioRFIDMovil.Datos
{
    public class SolicitudDA
    {
        #region --- Variables y Constantes ---
        private static readonly ILog log = LogManager.GetLogger(typeof(BienDA));

        private const string FORMATO_BUSQUEDA = "{0}='{1}'";

        // Parametros Entrada
        private const string PARAM_CURSOR = "P_LISTASOLICITUDES";
        private const string PARAM_COD_USUARIO = "P_IIDPERSONASOLICITA";

        private const string PARAM_IDSOLICITUD = "P_IIDSOLICITUD";
        private const string PARAM_IDESTADOSOLICITUD = "P_IIDSOLICITUDESTADO";
        private const string PARAM_USUARIOEDITA = "P_IIDUSUARIOEDITA";
       


        // Parametros Salida

        private const string IIDSOLICITUD = "IIDSOLICITUD";
        private const string DFECHASOLICITUD = "DFECHASOLICITUD";
        private const string IIDSOLICITUDESTADO = "IIDSOLICITUDESTADO";
        private const string IIDPERSONASOLICITA = "IIDPERSONASOLICITA";    

        #endregion

        #region --- Metodos Propios ---

        // Listar usuarios que tengan prestamos pendientes a devolver estado "Aprobado", "Pendiente";
        public ListaSolicitud listarSolicitudUsuarioSalida(Usuario usuario)
        {
            ListaSolicitud listaSolicitud = null;
            DataSet dsBienAlmacen = new DataSet();

            if (log.IsDebugEnabled)
            {
                log.Debug("listarSolicitudUsuarioSalida()");
            }

            using (Database db = new Database(ConstantesDAO.NombreInterface.ConexTvperu))
            {
                db.NombreProcedimiento = Constantes.PROCEDIMIENTO_RFID_OBTENERSOLICITUDSALIDA;
                db.agregarParametro(PARAM_COD_USUARIO, DbType.Int32, ParameterDirection.Input, usuario.idUsuario);
                db.agregarParametro(PARAM_CURSOR, DbType.Binary, ParameterDirection.Output, null);

                IDataAdapter dataAdapter = db.obtenerDataAdapter();
                dataAdapter.Fill(dsBienAlmacen);

                listaSolicitud = new ListaSolicitud();

                foreach (DataRow fila in dsBienAlmacen.Tables[0].Rows)
                {
                    listaSolicitud.Add(generarEntidad(fila));
                }
            }

            if (log.IsDebugEnabled)
            {
                log.Debug("Retornando " + listaSolicitud.Count + " registros");
            }

            return listaSolicitud;
        }

        // Listar usuarios que tengan prestamos pendientes a devolver estado "Registrado", "Pendiente";
        public ListaSolicitud listarSolicitudUsuarioEntrada(Usuario usuario)
        {
            ListaSolicitud listaSolicitud = null;
            DataSet dsBienAlmacen = new DataSet();

            if (log.IsDebugEnabled)
            {
                log.Debug("listarSolicitudUsuarioEntrada()");
            }

            using (Database db = new Database(ConstantesDAO.NombreInterface.ConexTvperu))
            {
                db.NombreProcedimiento = Constantes.PROCEDIMIENTO_RFID_OBTENERSOLICITUDENTRADA;
                db.agregarParametro(PARAM_COD_USUARIO, DbType.Int32, ParameterDirection.Input, usuario.idUsuario);
                db.agregarParametro(PARAM_CURSOR, DbType.Binary, ParameterDirection.Output, null);

                IDataAdapter dataAdapter = db.obtenerDataAdapter();
                dataAdapter.Fill(dsBienAlmacen);

                listaSolicitud = new ListaSolicitud();

                foreach (DataRow fila in dsBienAlmacen.Tables[0].Rows)
                {
                    listaSolicitud.Add(generarEntidad(fila));
                }
            }

            if (log.IsDebugEnabled)
            {
                log.Debug("Retornando " + listaSolicitud.Count + " registros");
            }

            return listaSolicitud;
        }

        private Solicitud generarEntidad(DataRow fila)
        {
            Solicitud solicitud = new Solicitud();
            solicitud.codSolicitud = Convert.ToInt32(fila[IIDSOLICITUD]);
            solicitud.fechaRegistro = Convert.ToDateTime(fila[DFECHASOLICITUD]);
            solicitud.idSolicitudEstado = Convert.ToInt32(fila[IIDSOLICITUDESTADO]);
            solicitud.usuarioSolicita = new Usuario();
            solicitud.usuarioSolicita.idUsuario = Convert.ToInt32(fila[IIDPERSONASOLICITA]);

            return solicitud;
        }


        public bool actualizarEstadoSolicitud(Solicitud solicitud)
        {
            bool resultado = false;

            if (log.IsDebugEnabled)
            {
                log.Debug("actualizarEstadoSolicitud()");
            }

            using (Database db = new Database(ConstantesDAO.NombreInterface.ConexTvperu))
            {
                //Actualizar estado de solicitud por codSolicitud y registra estadoSolicitud por código solicitud
                db.NombreProcedimiento = DataBaseHelper.obtenerNombreProcedimiento(Constantes.PROCEDIMIENTO_RFID_ACTUALIZARESTADOSOLICITUD);
                db.agregarParametro(PARAM_IDSOLICITUD, DbType.Int32, ParameterDirection.Input, solicitud.codSolicitud);
                db.agregarParametro(PARAM_IDESTADOSOLICITUD, DbType.Int32, ParameterDirection.Input, solicitud.idSolicitudEstado);  
                db.agregarParametro(PARAM_USUARIOEDITA, DbType.Int32, ParameterDirection.Input, solicitud.usuarioEdita.idUsuario);

                db.ejecutar();

                resultado = true;
            }

            return resultado;
        }

       
        #endregion
    }
}
